package leetcode.binarysearch;

/**
 * @Description
 * @Author 26233
 * @Create 2020-11-28 15:03:47
 *
 * 给定一个只包含整数的有序数组，每个元素都会出现两次，唯有一个数只会出现一次，找出这个数。
 *
 * 示例 1:
 *
 * 输入: [1,1,2,3,3,4,4,8,8]
 * 输出: 2
 * 示例 2:
 *
 * 输入: [3,3,7,7,10,11,11]
 * 输出: 10
 * 注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/single-element-in-a-sorted-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

public class LeetCode540_SingleNonDuplicate {

    /*
    计算分段后是否是2的倍数来确定单个数在左区间还是右区间
     */
    public int singleNonDuplicate(int[] nums) {
        if (nums.length == 1) return nums[0];
        int p = 0, q = nums.length - 1;
        while(p < q){
            int mid = (p + q) / 2;
            if(nums[mid] != nums[mid - 1] && nums[mid] != nums[mid + 1]) return nums[mid];
            if(nums[mid] == nums[mid - 1]){
                if((q - (mid - 1)) % 2 == 1){
                    q = mid - 2;
                }else p = mid + 1;
            }else if(nums[mid] == nums[mid + 1]){
                if((q - (mid + 1)) % 2 == 0){
                    q = mid - 1;
                }else p = mid + 2;
            }
        }
        return nums[p];
    }
}
